এসকিউএল একটি ডিক্লারেটিভ প্রোগ্রামিং ভাষা, এ কথা পূর্বেই বলা হয়েছে। এখানে কী করতে হবে, এটিই গুরুত্বপূর্ণ। কীভাবে করতে হবে, সেটি ডেটাবেজ সফটওয়্যারের দায়িত্ব। এখন, কোনো টেবিলে যখন অনেক অনেক বেশি ডেটা থাকে (যেমন— পাঁচ লক্ষ, দশ লক্ষ কিংবা আরো বেশি), তখন বিভিন্ন কুয়েরির গতি অনেক কমে যায়, অর্থাৎ কুয়েরি চলতে অনেক বেশি সময় লাগে। যেমন— একটি টেবিলে যদি এ বছরের মাধ্যমিক পরীক্ষায় ঢাকা বোর্ডের সব শিক্ষার্থীর ডেটা থাকে, তাহলে সেই টেবিলে পাঁচ থেকে দশ লক্ষের মতো রেকর্ড বা রো থাকবে। এখন যদি সেখান থেকে নাম কিংবা রোল নম্বর (বা রেজিস্ট্রেশন নম্বর) দিয়ে একজন শিক্ষার্থীর তথ্য বের করার চেষ্টা করা হয়, তাহলে সেই কুয়েরি চলতে বেশ সময় লাগবে। কারণ তখন লিনিয়ার সার্চের মাধ্যমে এক এক করে সবার তথ্য পরীক্ষা করা হবে এবং যাদের সঙ্গে মিল পাওয়া যাবে, তাদের তথ্য দেখানো হবে। লিনিয়ার সার্চ কীভাবে কাজ করে সেটি আগের অধ্যায়ে আলোচনা করা হয়েছে। টেবিলে যত বেশি রেকর্ড থাকবে, তত বেশি সময় লাগবে।
ইনডেক্সিং হচ্ছে একটি বিশেষ পদ্ধতি, যার মাধ্যমে ডেটা সহজে ও দ্রুত খুঁজে পাওয়া যায়। যেমন— ডিকশনারি বা অভিধান ব্যবহার করার সময় কোনো শব্দ খুঁজতে কিন্তু বেশি সময় লাগে না। কারণ শব্দগুলো একটি ক্রমে সাজানো থাকে, এবং অভিধানের কোনো পাতা খুললে কাঙ্ক্ষিত শব্দটি ওই পাতায়, নাকি তার আগে না পরে আছে, সেটি সহজেই বোঝা যায়। ডেটা যদি সর্ট করা থাকে তাহলে বাইনারি সার্চ ব্যবহার করে খুব দ্রুতে খুঁজে পাওয়া যায়। তেমনি কোনো বিশেষ কলামের উপর ইনডেক্স তৈরি করলে সেই কলামের মান দিয়ে ডেটা খুঁজলে ডেটাবেজ সফটওয়্যার খুব দ্রুত সেটি বের করে দিতে পারে। ডেটাবেজ কীভাবে ইনডেক্স তৈরি করার কাজটি করবে, সেটি ব্যবহারকারীর জানতে হয় না, কেবল কোন কলামের উপর ইনডেক্স তৈরি করতে হবে, সেটি বলে দিতে হয়। প্রয়োজন হলে একাধিক কলামের উপরও ইনডেক্স তৈরি করা যায়।
ইনডেক্স তৈরির কুয়েরি লেখার নিয়ম হচ্ছে—
CREATE INDEX [ইনডেক্সের নাম] ON [টেবিলের নাম] ([কলামের নাম], একাধিক কলামের ক্ষেত্রে নামগুলো কমা দিয়ে পৃথক করা থাকতে হবে);
যেমন— class কলামের উপর ইনডেক্স তৈরি করতে চাইলে নিচের কুয়েরি লিখতে হবে
CREATE INDEX student_class_idx ON student (class ) ;
ইনডেক্স তৈরি করলে কলামের উপর নির্ভর করে ডেটা খুঁজে পেতে যেমন সহজ হয়, তেমনি যেই কলামের উপর ইনডেক্স করা হয়েছে, সেটি অনুসারে সর্ট করলেও সর্ট করার কাজটি দ্রুত হয়। উপরের ইনডেক্স তৈরি করার ফলে SELECT * FROM student ORDER BY class; কুয়েরিটি অনেক দ্রুত কাজ করবে।
আবার অনেক সময় অনন্য (unique) ইনডেক্স তৈরি করা যায়, যেন একই ডেটা ডেটাবেজে একাধিকবার না ঢোকে। যেমন— নিচের ইনডেক্স তৈরি করা হলে student টেবিলে একই শাখার একই ক্লাসের একই রোল নম্বরের কেবল একজন শিক্ষার্থী থাকবে-
CREATE UNIQUE INDEX unique_student_idx ON student (section, class, roll) ;
কাজটি টেবিল তৈরি করার পরে যে কোনো সময় করা যায়। এমনকি টেবিলে ডেটা রাখার পরেও করা যায়। আবার টেবিল তৈরি করার সময়ও এক বা একাধিক ফিল্ডকে ইউনিক ঘোষণা করা যায়।
দশম শ্রেণির day শাখার রোল নম্বর 1 ইতোমধ্যে student টেবিলে আছে। এখন যদি এরকম আরেকটি ডেটা রাখার চেষ্টা করা হয়, তাহলে ডেটাবেজ সেটি হতে দেবে না। ইতিপূর্বে একটি উদাহরণে দেখানো হয়েছিল যে একই ক্লাসের একই রোল নম্বরে দুজন শিক্ষার্থীর ডেটা টেবিলে ঢুকে গিয়েছে। ইউনিক ইনডেক্স ব্যবহার করলে বিষয়টি এড়ানো যায়।
sqlite > INSERT INTO student (name, class, roll, section) VALUES ( ' Maysha', 10, 1, ' day' ) ; Error: UNIQUE constraint failed: student.section, student.class, student.roll
উল্লেখ্য যে, কোনো টেবিলে কোনো কলামকে প্রাইমারি কি হিসেবে ঘোষণা করলে ডেটাবেজ আপনা-আপনি ওই কলামের উপর ইনডেক্স তৈরি করে নেয়, আলাদাভাবে ইনডেক্স তৈরি করার প্রয়োজন হয় না।
ডেটাবেজে ইনডেক্স তৈরির বিভিন্ন সুবিধার পাশাপাশি কিছু অসুবিধাও আছে। প্রথমত, ইনডেক্স তৈরির পরে সেই টেবিলে কোনো নতুন ডেটা যোগ করা, মুছে ফেলা বা পরিবর্তন করা হলে ইনডেক্স যেখানে তৈরি করা হয়েছে, সেখানেও পরিবর্তন হয়। কাজটি ডেটাবেজ নিজেই করে, তবে এর ফলে INSERT, UPDATE, DELETE কুয়েরি চলতে আগের চেয়ে বেশি সময় লাগে। এছাড়া ইনডেক্স তৈরি করতে অতিরিক্ত জায়গার প্রয়োজন হয়, অর্থাৎ হার্ড ডিস্কের অতিরিক্ত জায়গা খরচ হয়।
কোনো ইনডেক্স মুছে ফেলতে হলে DROP INDEX লিখে তারপরে ইনডেক্সের নাম লিখতে হবে। যেমন—
DROP INDEX student class idx;
আরও দেখুন...